% TODO to be resynced with EN version
\subsection{GCC---eine weitere Sache}
\label{use_parts_of_C_strings}

Die Tatsache, dass eine \IT{anonyme} C-Zeichenkette den Typ \IT{const} hat (\myref{string_is_const_char}), 
und dass C-Zeichenketten im Segment für konstante Daten angelegt sind (was dafür sorgt, dass sie unveränderbar sind),
hat eine interessante Auswirkung: der Compiler kann spezifische Teile der Zeichenkette verwenden.

Probieren wir das folgende Beispiel:

\begin{lstlisting}[style=customc]
#include <stdio.h>

int f1()
{
	printf ("world\n");
}

int f2()
{
	printf ("hello world\n");
}

int main()
{
	f1();
	f2();
}
\end{lstlisting}

Gebräuchliche \CCpp{}-Compiler (inklusive MSVC) allozieren zwei Strings.
Im Folgenden jedoch ist abgebildet, was GCC 4.8.1 erzeugt:

\begin{lstlisting}[caption=GCC 4.8.1 + IDA,style=customasmx86]
f1              proc near

s               = dword ptr -1Ch

                sub     esp, 1Ch
                mov     [esp+1Ch+s], offset s ; "world\n"
                call    _puts
                add     esp, 1Ch
                retn
f1              endp

f2              proc near

s               = dword ptr -1Ch

                sub     esp, 1Ch
                mov     [esp+1Ch+s], offset aHello ; "hello "
                call    _puts
                add     esp, 1Ch
                retn
f2              endp

aHello          db 'hello '
s               db 'world',0xa,0
\end{lstlisting}

Wenn die Zeichenkette \q{hello world} ausgegeben wird, werden die beiden Worte im Speicher nebeneinander
positioniert und die Funktion \puts in \GTT{f2()} merkt nicht, dass die Zeichenkette geteilt ist.
Tatsächlich ist sie lediglich \q{virtuell} in diesem Listing geteilt.

Wenn \puts aus der Funktion \GTT{f1()} aufgerufen wird, wir die \q{world}-Zeichenkette plus einem Null-Byte
genutzt. \puts merkt nicht, dass sich davor noch etwas befindet.

Dieser clevere Trick wird von GCC oft genutzt und ermöglicht das Einsparen von etwas Speicher.

Ein weiteres Beispiel ist hier: \myref{strstr_example}.

